package com.tbit.uqbike.webmanager.dao.core;

import com.tbit.uqbike.object.pojo.*;
import com.tbit.uqbike.object.pojo.statistics.RideCardOrderDaySta;
import com.tbit.uqbike.object.pojo.vo.RideCardOfUserByOrderVO;
import com.tbit.uqbike.object.pojo.vo.RideCardUserVO;
import com.tbit.uqbike.object.value.UserRcDetail;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 骑行会员Dao
 *
 * @author Leon
 * 2019年9月24日 下午4:09:10
 */
public interface RideCardDao {

    /**
     * 分页查询
     *
     * @param map
     * @return
     */
    List<RideCard> queryPage(Map<String, Object> map);

    /**
     * 分页查询总数
     *
     * @param map
     * @return
     */
    Integer queryCount(Map<String, Object> map);

    /**
     * 添加
     *
     * @param rideCard
     */
    void insert(RideCard rideCard);

    /**
     * 修改
     *
     * @param rideCard
     */
    void edit(RideCard rideCard);

    /**
     * 根据id查询
     *
     * @param rideCardId
     * @return
     */
    RideCard getById(Integer rideCardId);

    /**
     * 修改为已失效
     *
     * @param rideCardId
     */
    void editEnable(Integer rideCardId);

    /**
     * 骑行卡用户购买记录分页
     *
     * @param map
     * @return
     */
    List<UserMember> userRideCardPage(Map<String, Object> map);

    /**
     * 骑行卡用户购买记录分页总数
     *
     * @param map
     * @return
     */
    Integer userRideCardCount(Map<String, Object> map);

    /**
     * 获取骑行卡金额
     */
    Integer getMoneyByTime(Map<String, Object> map);

    /**
     * 骑行卡订单按天统计或按月统计
     */
    List<StatPark> statByType(Map<String, Object> map);

    /**
     * 按代理分组，统计时间段内订单总数及总金额
     */
    List<MoneyData> groupByAccountId(Map<String, Object> map);

    /**
     * 骑行卡统计分页
     */
    List<UserRcDetail> getRideCardPage(Map<String, Object> map);

    /**
     * 骑行卡统计分页总数
     */
    Integer getRideCardCount(Map<String, Object> map);

    /**
     * 骑行卡统计导出
     */
    List<UserRcDetail> export(Map<String, Object> map);

    /**
     * 骑行卡统计总金额
     */
    MoneyData getTotalMoney(Map<String, Object> map);

    /**
     * 根据条件筛选骑行卡数据
     *
     * @param params 参数个数
     * @return {@link List}<{@link UserRcDetail}>
     */
    List<UserRcDetail> selectData(Map<String, Object> params);

    /**
     * 修改骑行卡次数
     */
    void updateuserRideCard(Map<String, Object> params);

    /**
     * 根据购买订单号修改骑行卡使用次数
     *
     * @param orderNo    购买订单号
     * @param currentNum 修改次数
     */
    void updateCurrentNumByOrderNo(@Param("orderNO") String orderNo, @Param("currentNum") Integer currentNum);

    /**
     * 骑行卡失效
     */
    int updateValid(UserMember userMember);

    /**
     * 通过各类骑行卡购买金额
     */
    List<Map<String, Object>> selectCountByType(Map<String, Object> params);

    /**
     * 统计前一天的骑行卡数量
     */
    Map<String, Object> statYesterdayRideCard(Map<String, Object> params);

    /**
     * 统计骑行卡
     *
     * @param params 参数个数
     * @return {@link RideCardOrderDaySta}
     */
    RideCardOrderDaySta statRideCard(Map<String, Object> params);

    List<Map<String, Object>> statByDay(Map<String, Object> params);

    List<Map<String, Object>> statByDayLog(Map<String, Object> params);


    UserMember getByOrderNO(String orderNO);


    /**
     * 查询骑行卡
     *
     * @param accountId     .
     * @param stopStartTime .
     * @param stopEndTime   .
     * @return .
     */
    List<RideCardUserVO> selectRideCardUserToDelay(@Param("accountId") Integer accountId, @Param("stopStartTime") Date stopStartTime, @Param("stopEndTime") Date stopEndTime);

    /**
     * 修改骑行卡有效期
     *
     * @param cardBase 。
     */
    void updateEndTimeByOrderNo(RideCardUser cardBase);

    RideCardUser findRideCardUserByOrderNoAndUserId(@Param("orderNo") String orderNo, @Param("userId") Integer userId);

    /**
     * 统计用户骑行套餐
     *
     * @param queryMap 。
     * @return .
     */
    Integer countRideCardUserBy(Map<String, Object> queryMap);

    /**
     * 查询用户生效的骑行卡
     *
     * @param queryMap 。
     * @return 。
     */
    RideCardUserVO queryValidUserRideCard(Map<String, Object> queryMap);

    /**
     * 新增骑行卡模板
     *
     * @param rideCard rideCard
     */
    void addRideCardTemplate(RideCard rideCard);

    /**
     * 删除骑行卡模板
     *
     * @param rideCardId
     */
    void deleteTemplate(Integer rideCardId);

    /**
     * 查询骑行卡模板
     *
     * @param accountId 品牌id
     * @return List<RideCard>
     */
    List<RideCard> queryTemplate(Integer accountId);

    /**
     * 根据模板名称查重
     *
     * @param rideCard rideCard
     * @return int
     */
    int getByName(RideCard rideCard);

    /**
     * 根据骑行卡名称查重
     *
     * @return int
     */
    int getCardByName(RideCard rideCard);

    /**
     * 根据名称和品牌删除骑行卡模板
     *
     * @param rideCard rideCard
     */
    void deleteTemplateByName(RideCard rideCard);

    /**
     * 修改头部一下的排序 + 1
     *
     * @param accountId
     */
    void updateHeadSort(@Param("accountId") Integer accountId);

    /**
     * 获取区域骑行卡数量
     *
     * @param accountId
     * @return
     */
    int selectCount(@Param("accountId") Integer accountId);

    /**
     * 修改排序
     *
     * @param rideCard rideCard
     */
    void updateSort(RideCard rideCard);

    /**
     * 是否存在该排序
     *
     * @param newSort   排序值
     * @param accountId 区域id
     * @return int
     */
    int selectSort(Integer newSort, Integer accountId);

    /**
     * 修改其他排序
     *
     * @param accountId 区域id
     * @param sort      旧排序
     * @param newSort   新排序
     */
    void updateOtherSort(@Param("accountId") Integer accountId, @Param("sort") Integer sort, @Param("newSort") Integer newSort);

    /**
     * 大于sort的排序前移一位
     *
     * @param accountId 区域id
     * @param sort      排序值
     */
    void updateMoveForword(@Param("accountId") Integer accountId, @Param("sort") Integer sort);

    /**
     * 查询骑行套餐
     * @param accountId 区域id
     * @return List<RideCard>
     */
    List<RideCard> selectByAccountId(@Param("accountId") Integer accountId);

    /**
     * 批量新增
     * @param rideCards rideCards
     */
    void batchAdd(@Param("rideCards")List<RideCard> rideCards);

    void UpdateByAccountId(@Param("accountId") Integer accountId);

    /**
     * 根据用户id和区域id集合获取最近骑行卡购买记录
     *
     * @param userId        用户id
     * @param accountIdList 区域id集合
     */
    UserMember userRideCardByAccountIdList(@Param("userId") Integer userId, @Param("accountIdList") List<Integer> accountIdList);

    /**
     * 获取用户有效骑行卡
     * @param userId 用户id
     * @param accountId 区域id
     * @return  RideCard
     */
    RideCardOfUserByOrderVO getEfficientRideCard(@Param("userId") Integer userId, @Param("accountId") Integer accountId);

    /**
     * 获取用户有效骑行卡
     * @param userId        用户id
     * @param accountId     区域id
     * @return              UserMember
     */
    UserMember selectByUserIdAndAccountId(@Param("userId") Integer userId, @Param("accountId") Integer accountId);

    /**
     * 查询已有生效中骑行卡的用户手机号
     * @param accountId         区域id
     * @param isDbList     手机号
     * @return  List<String>
     */
    List<Integer> selectDoesNotExistRideCard(@Param("accountId") Integer accountId, @Param("isDbList") List<Integer> isDbList);

    /**
     * 批量新增
     * @param rideCardUserList  用户骑行卡
     */
    void batchInsertRideCardUser(@Param("rideCardUserList") List<RideCardUser> rideCardUserList);

    /**
     * 查询骑行卡
     * @param rideCardId  骑行卡id
     * @param accountId   区域id
     * @return  RideCard
     */
    RideCard getByAccountIdAndRideCardId(@Param("rideCardId") Integer rideCardId, @Param("accountId") Integer accountId);
}
